#version 300 es

//https://blog.csdn.net/qjh5606/article/details/82592207
precision mediump float;
//2d纹理id
layout (location = 10) uniform sampler2D SamplerY;
layout (location = 11) uniform sampler2D SamplerU;
layout (location = 12) uniform sampler2D SamplerV;
//当前片段对应的纹理坐标
in vec2 V_Texcoord;
//输出片段颜色
out vec4 fragColor;

//用来做YUV --> RGB 的变换矩阵
const vec3 delyuv = vec3(-0.0/255.0, -128.0/255.0, -128.0/255.0);
const mat3 matYUVRGB33 = mat3(
1.0, 0.0, 1.4075,
1.0, -0.3455, -0.7169,
1.0, 1.7790, 0.0
);

vec4 blur(vec2 position);
vec4 gaussianBlur(vec2 position);
vec4 getRGB(vec2 position);

void main() {
        fragColor = getRGB(V_Texcoord);
//        fragColor = blur(V_Texcoord);
//    fragColor = gaussianBlur(V_Texcoord);
    //
    //    //这个是仿造801中的yuv转rgb的算法。百度时发现有很多人计算常量参数不太一样。
    //    //    float y, u, v, r, g, b;
    //    //    y = texture(SamplerY, V_Texcoord).r;
    //    //    u = texture(SamplerU, V_Texcoord).r;
    //    //    v = texture(SamplerV, V_Texcoord).r;
    //    //    u = u - 0.5;
    //    //    v = v - 0.5;
    //    //    r = y + 1.4075*v;
    //    //    g = y - 0.3455*u - 0.7169*v;
    //    //    b = y + 1.7790*u;
    //    //    fragColor = vec4(r, g, b, 1.0);
    //    //    //    fragColor = vec4(y, y, y, 1.0);
    //    //    //    fragColor = vec4(u, u, u, 1.0);
    //    //    //    fragColor = vec4(v, v, v, 1.0);
    //
    //    //矩阵运算来实现yuv转rgb，实际转化的计算量并不高，恐怕没上面直接计算来的快吧。。。。
    //    //从纹理根据坐标读取yuv
    //    vec3 yuv = vec3(
    //    texture(SamplerY, V_Texcoord).r,
    //    texture(SamplerU, V_Texcoord).r,
    //    texture(SamplerV, V_Texcoord).r
    //    );
    //
    //    //特效1：灰阶，将图象转黑白，即uv分量取中间值，实现图象去色
    //    //    yuv.y = 0.5;
    //    //    yuv.z = 0.5;
    //
    //    //图象复古效果，在灰阶的基础上，偏移uv分量
    //    // sepia / sepiagreen / sepiablue
    //    //特效2：复古蓝
    //    //    yuv.y = 0.5 + 88.0 / 255.0;
    //    //    yuv.z = 0.5 - 30.0 / 255.0;
    //    //特效3：复古绿
    //    //    yuv.y = 0.5 - 88.0 / 255.0;
    //    //    yuv.z = 0.5 + 30.0 / 255.0;
    //
    //    //使用向量相加，对yuv值进行偏移，作用是让uv都减去0.5
    //    yuv += delyuv;
    //    //将向量应用于矩阵变化,让其每个维度都做对应的计算，变换成rgb
    //    vec3 rgb =yuv*matYUVRGB33;
    //
    //    //特效4：负片，反转rgb各通道数值
    //    //    rgb =vec3(1.0, 1.0, 1.0)-rgb;
    //
    //    //vec4表示四维向量，读取值可用xyzw或rgba来读取，也可以用agb[0] agb[1] agb[2]来读取
    //    fragColor = vec4(rgb.r, rgb.g, rgb.b, 1.0);
}
//模糊，计算当前点左上，右上，左下，右下位置点的颜色平均值作为当前颜色
vec4 blur(vec2 position){
    vec4 sample0;
    vec4 sample1;
    vec4 sample2;
    vec4 sample3;
    float fstep = 10.0/1080.0;
    sample0=getRGB(vec2(position.x - fstep, position.y - fstep));
    sample1=getRGB(vec2(position.x + fstep, position.y - fstep));
    sample2=getRGB(vec2(position.x + fstep, position.y + fstep));
    sample3=getRGB(vec2(position.x - fstep, position.y + fstep));
    vec4 color = (sample0 + sample1 + sample2 + sample3) / 4.0;
    return color;
}
//高斯模糊，使用高斯分布给周围点颜色加权重，根据权重来计算颜色值
vec4 gaussianBlur(vec2 position){
    float weight0 = 4.0/16.0;
    float weight1 = 2.0/16.0;
    float weight2 = 1.0/16.0;
    float texelOffset = 20.0/1080.0;
    vec2 uv0=position;
    vec4 sum = getRGB(uv0)*weight0;
    //上下参考值
    sum += getRGB(uv0 + vec2(0.0, texelOffset*1.0)) * weight1;
    sum += getRGB(uv0 - vec2(0.0, texelOffset*1.0)) * weight1;
    sum += getRGB(uv0 + vec2(0.0, texelOffset*2.0)) * weight2;
    sum += getRGB(uv0 - vec2(0.0, texelOffset*2.0)) * weight2;
    //左右参考值
    sum += getRGB(uv0 + vec2(texelOffset*1.0, 0.0)) * weight1;
    sum += getRGB(uv0 - vec2(texelOffset*1.0, 0.0)) * weight1;
    sum += getRGB(uv0 + vec2(texelOffset*2.0, 0.0)) * weight2;
    sum += getRGB(uv0 - vec2(texelOffset*2.0, 0.0)) * weight2;

    //第二次高斯算法，
//    sum = sum*weight0;
//    //上下参考值
//    sum += getRGB(uv0 + vec2(0.0, texelOffset*1.0)) * weight1;
//    sum += getRGB(uv0 - vec2(0.0, texelOffset*1.0)) * weight1;
//    sum += getRGB(uv0 + vec2(0.0, texelOffset*2.0)) * weight2;
//    sum += getRGB(uv0 - vec2(0.0, texelOffset*2.0)) * weight2;
//    //左右参考值
//    sum += getRGB(uv0 + vec2(texelOffset*1.0, 0.0)) * weight1;
//    sum += getRGB(uv0 - vec2(texelOffset*1.0, 0.0)) * weight1;
//    sum += getRGB(uv0 + vec2(texelOffset*2.0, 0.0)) * weight2;
//    sum += getRGB(uv0 - vec2(texelOffset*2.0, 0.0)) * weight2;
    return vec4(sum.rgb, 1.0);
}
vec4 getRGB(vec2 position){
    vec3 yuv = vec3(
    texture(SamplerY, position).r,
    texture(SamplerU, position).r,
    texture(SamplerV, position).r
    );
    yuv += delyuv;
    vec3 rgb =yuv*matYUVRGB33;
    return vec4(rgb.r, rgb.g, rgb.b, 1.0);
}

